// Extensão css para jProton.
/**#@+ @extends css */
jProton.extend(element, /** @lends jProton.element */ {

  '@extension': {'css': '0.3.0a'},

  /**
   * Verifica se o elemento possui uma determinada classe.
   * 
   * @param {Element}  e      Elemento alvo.         
   * @param {String}   name   Nome da classe.
   */
  hasClass: function(e, name) {
    return (' '+e.className+' ').indexOf(' '+name+' ') != -1;
  },

  /**
   * Processa a lógica de addClass() para um único elemento.
   *
   * @param {Element}  e      Elemento alvo.         
   * @param {String}   name   Nome da classe.
   */
  addClass: function(e, name) {
    // cópia de performance de jProton.hasClass(e, name)
    if ((' '+e.className+' ').indexOf(' '+name+' ') == -1)
      e.className = e.className ? e.className + ' ' + name : name; 
  },

  /**
   * Processa a lógica de removeClass() para um único elemento.
   * 
   * @param {Element}  e      Elemento alvo.         
   * @param {String}   name   Nome da classe.
   */
  removeClass: function(e, name) {
    e.className = (' ' + e.className + ' ').
        replace(new RegExp('(\\S*)\\s+'+name+'\\s+(\\S*)', 'g'), '$1 $2').
        replace(/^\s*|\s*$/g, '');
  },

  /**
   * Alterna o uso de uma classe em todos os elementos selecionados.
   *
   * @param {Element} e      Elemento alvo.         
   * @param {String}  name   Nome da classe.
   */
  toggleClass: function(e, name) {
    // cópia de performance de jProton.hasClass(e, name)
    if ((' '+e.className+' ').indexOf(' '+name+' ') >= 0)
      this.removeClass(e, name)
    else
      this.addClass(e, name);
  },

  /**
   * Retorna o valor da propriedade de estilo do elemento.
   * Baseado em: [[http://www.quirksmode.org/dom/getstyles.html|quirksmode]].
   * 
   * @param {Element} e      Elemento alvo.         
   * @param {String}  name   Nome da propriedade de estilo.
   * @param {String}  val    Valor a ser atribuído.
   */
  css: function(e, name, val) {
    if (e) {
      if (val) 
        // processa css(name, val)
        e.style[name] = val;

      else {
        var type = typeof name;

        if (type == 'object')
          // processa css(e, {name1: val1, name2: val2})
          for (p in name)
            e.style[p] = name[p]

        else
          // processa css(e, name)
          return window.getComputedStyle ? // Tenta o modo Mozilla
              document.defaultView.getComputedStyle(e,null)[name] || 
              e.style[name] :          // Ou então, tenta a propriedade style
              e.currentStyle ?         // Tenta o modo IE
              e.currentStyle[name] ||  // Se não der certo,
              e.style[name] :          // tenta a propriedade style. Senão,
              undefined;               // Não foi possível recuperar o estilo
      }
    } else
      return undefined;
  }

  /**#@-*/
});
